﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using UricaoWeb.LogicaDeNegocios.Propiedad;
using System.Data.Sql;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles;

namespace UricaoWeb.Presentacion
{
	public partial class API_propiedades_ModificarHabitacion : API_Seguridad_Principal
	{
		LogicaPropiedades _hotel = new LogicaPropiedades();

		protected void Page_Load(object sender, EventArgs e)
		{
            var master = Master as MasterPage;
            if (master != null)
            {
                master.actualizar_label();
            }
            base.validar_usuario();

			if (!IsPostBack)
			{
				//LlenarCBHoteles();
				EsconderDropListsYLabels();
			}
			else
			{
				MostrarDropListsYLabels();
				if(contenedorAlterno.Visible == true)
				{
					gridHabitaciones1.Visible = false;
				}
				
			}
		}

		#region LLENADO DE DROPLISTS
		protected void CBlistaHoteles_Init(object sender, EventArgs e)
		{
			Logica_Usuario _seguridad = (Logica_Usuario)Session["user"];
			//LogicaPropiedades._idHotel = _hotel.GetHotelByUser(_seguridad.NombreUsuario);
			Session["idHotel"] = LogicaPropiedades._idHotel;
			LlenarCBHoteles();
			SeleccionarCBHotelIndex();
			//CBlistaHoteles_SelectedIndexChanged(sender, e);

		}

		private void SeleccionarCBHotelIndex()
		{
			int contadorIndices = CBlistaHoteles.Items.Count - 1;
			CBlistaHoteles.Enabled = false;

			while (contadorIndices >= 0)
			{
				CBlistaHoteles.SelectedIndex = contadorIndices;
				if (CBlistaHoteles.SelectedValue.ToString() == Session["idHotel"].ToString())
				{
					CBlistaHoteles.SelectedIndex = contadorIndices;
					break;
				}
				contadorIndices--;
			}

			EliminarItemsDropList(CBlistaHabitaciones);
			EliminarItemsDropList(CBlistaHabsTipo);
			EliminarItemsDropList(CBpisoHabitacion);

			LlenarCBNumeroHabitaciones(Convert.ToInt32(LogicaPropiedades._idHotel));
			LlenarCBTipoHabitacion(Convert.ToInt32(LogicaPropiedades._idHotel));
			LlenarCBPisoHabitaciones(Convert.ToInt32(LogicaPropiedades._idHotel));
			MostrarDropListsYLabels();
		}

		private void LlenarCBHoteles()
		{
			LogicaPropiedades _getHoteles = new LogicaPropiedades();
			CBlistaHoteles.DataSource = _getHoteles.GetAllHoteles();
			CBlistaHoteles.DataBind();
		}

		private void LlenarCBNumeroHabitaciones(int _idHotel)
		{
			LogicaPropiedades _getNumHabitaciones = new LogicaPropiedades();
			CBlistaHabitaciones.DataSource = _getNumHabitaciones.GetHabitaciones(_idHotel);
			CBlistaHabitaciones.DataBind();
		}

		private void LlenarCBTipoHabitacion(int _idHotel)
		{
			LogicaPropiedades _getHabitacionesTipo = new LogicaPropiedades();
			CBlistaHabsTipo.DataSource = _getHabitacionesTipo.HabitacionesPorTipo(_idHotel);
			CBlistaHabsTipo.DataBind();
		}

		private void LlenarCBPisoHabitaciones(int _idHotel)
		{
			LogicaPropiedades _getHabitacionesPorPiso = new LogicaPropiedades();
			CBpisoHabitacion.DataSource = _getHabitacionesPorPiso.HabitacionesPorPiso(_idHotel);
			CBpisoHabitacion.DataBind();
		}
		#endregion

		#region LLENADO DE GRIDVIEW
		private void LlenarGridPorNumeroHabitacion(string _idHotel, string _idHabitacion)
		{
			LogicaPropiedades filtrado = new LogicaPropiedades();
			gridHabitaciones1.DataSource = filtrado.filtrarPorNumeroHabitacion(_idHabitacion, _idHotel);
			gridHabitaciones1.DataBind();
		}

		private void LlenarGridPorTipoHabitacion(string _idHotel, string _tipoHabitacion)
		{
			LogicaPropiedades _porTipoHabitacion = new LogicaPropiedades();
			gridHabitaciones1.DataSource = _porTipoHabitacion.filtrarPorTipoHabitacion(_tipoHabitacion, _idHotel);
			gridHabitaciones1.DataBind();
		}

		private void LlenarGridPorPisoHabitacion(string _idHotel, string _numeroPiso)
		{
			LogicaPropiedades _porPisoHabitacion = new LogicaPropiedades();
			gridHabitaciones1.DataSource = _porPisoHabitacion.filtrarPorPisoHabitacion(_numeroPiso, _idHotel);
			gridHabitaciones1.DataBind();
		}
		#endregion

		#region CAMBIO DE INDICES
		protected void CBlistaHoteles_SelectedIndexChanged(object sender, EventArgs e)
		{
			MostrarDropListsYLabels();
			if (!IsPostBack)
			{
				LlenarCBNumeroHabitaciones(Convert.ToInt32(Session["idHotel"].ToString()));
				LlenarCBTipoHabitacion(Convert.ToInt32(Session["idHotel"].ToString()));
				LlenarCBPisoHabitaciones(Convert.ToInt32(Session["idHotel"].ToString()));
			}
			else
			{
				if (CBlistaHoteles.SelectedValue == "0")
				{
					EsconderDropListsYLabels();
					ResetElementosDropList();
				}
				else
				{
					EliminarItemsDropList(CBlistaHabitaciones);
					EliminarItemsDropList(CBlistaHabsTipo);
					EliminarItemsDropList(CBpisoHabitacion);

					LlenarCBNumeroHabitaciones(Convert.ToInt32(Session["idHotel"].ToString()));
					LlenarCBTipoHabitacion(Convert.ToInt32(Session["idHotel"].ToString()));
					LlenarCBPisoHabitaciones(Convert.ToInt32(Session["idHotel"].ToString()));
				}

			}
		}

		protected void CBlistaHabitaciones_SelectedIndexChanged(object sender, EventArgs e)
		{
			CBlistaHabsTipo.SelectedIndex = 0;
			CBpisoHabitacion.SelectedIndex = 0;
			if (!IsPostBack)
			{
				CBlistaHoteles.DataBind();
				LlenarGridPorNumeroHabitacion(CBlistaHoteles.SelectedValue.ToString(), CBlistaHabitaciones.SelectedValue.ToString());
			}
			else
			{
				LlenarGridPorNumeroHabitacion(CBlistaHoteles.SelectedValue.ToString(), CBlistaHabitaciones.SelectedValue.ToString());
			}
		}

		protected void CBlistaHabsTipo_SelectedIndexChanged(object sender, EventArgs e)
		{
			CBpisoHabitacion.SelectedIndex = 0;
			CBlistaHabitaciones.SelectedIndex = 0;
			if (!IsPostBack)
			{
				CBlistaHoteles.DataBind();
				LlenarGridPorTipoHabitacion(CBlistaHabsTipo.SelectedValue.ToString(), CBlistaHoteles.SelectedItem.ToString());
			}
			else
			{
				LlenarGridPorTipoHabitacion(CBlistaHoteles.SelectedValue.ToString(), CBlistaHabsTipo.SelectedItem.ToString());
			}
		}

		protected void CBpisoHabitacion_SelectedIndexChanged(object sender, EventArgs e)
		{
			CBlistaHabitaciones.SelectedIndex = 0;
			CBlistaHabsTipo.SelectedIndex = 0;
			if (!IsPostBack)
			{
				CBlistaHoteles.DataBind();
				LlenarGridPorPisoHabitacion(CBlistaHoteles.SelectedValue.ToString(), CBpisoHabitacion.SelectedValue.ToString());
			}
			else
			{
				LlenarGridPorPisoHabitacion(CBlistaHoteles.SelectedValue.ToString(), CBpisoHabitacion.SelectedValue.ToString());
			}
		}

		protected void listaTipoHabitaciones_SelectedIndexChanged(object sender, EventArgs e)
		{
			AsignarCapacidadHabitacionSegunTipo();
		}
		#endregion

		#region FUNCIONES UTILIDAD

		protected void CBnumHabsHidden_Init(object sender, EventArgs e)
		{
			LogicaPropiedades _habitaciones = new LogicaPropiedades();
			CBnumHabsHidden.DataSource = _habitaciones.GetHabitaciones(Convert.ToInt32(LogicaPropiedades._idHotel));
			CBnumHabsHidden.DataBind();
		}

		private Boolean ValidarNumHabNoRepetido(string _numHab, string _idHabitacion)
		{
			Boolean _numeroCambiado = false;
			
			LogicaPropiedades _habitaciones = new LogicaPropiedades();

			CBnumHabsHidden.DataSource = _habitaciones.GetHabitacionesSinLaSeleccionada(Convert.ToInt32(LogicaPropiedades._idHotel),_idHabitacion);
			CBnumHabsHidden.DataBind();
			int _contador = CBnumHabsHidden.Items.Count - 1;
			while (_contador > 0)
			{
				CBnumHabsHidden.SelectedIndex = _contador;
				if (CBnumHabsHidden.SelectedValue == (Convert.ToInt32(_numHab)).ToString())
				{
					ActualizarCBHidden(Convert.ToInt32(Session["idHotel"].ToString()));
					_numeroCambiado = true;
					return false;
				}
				_contador--;
			}

			if (!_numeroCambiado)
			{
				return true;
			}

			return false;
		}

		private Boolean CargarDatosEnElementos(int _idHabitacion)
		{
			Boolean _datosCargados = false;
			DataSet _tablaValoresViejos = new DataSet();
			LogicaPropiedades _cargaTabla = new LogicaPropiedades();

			_tablaValoresViejos = _cargaTabla.LlenarTablaHabitacionPorId(_idHabitacion.ToString());
			string _disponibilidad = _tablaValoresViejos.Tables[0].Rows[0]["disponibilidadHabitacion"].ToString();
			if (_disponibilidad == "True" || _disponibilidad == "true")
			{
				idHabitacion.Value = _idHabitacion.ToString();
				idHotel.Value = _tablaValoresViejos.Tables[0].Rows[0]["fkHotel"].ToString();
				numeroHabitacion.Text = _tablaValoresViejos.Tables[0].Rows[0]["numeroHabitacion"].ToString();
				TBpiso.Text = _tablaValoresViejos.Tables[0].Rows[0]["Piso"].ToString();
				descripcionHabitacion.Text = _tablaValoresViejos.Tables[0].Rows[0]["descripcionHabitacion"].ToString();
				capacidadHabitacion.Text = _tablaValoresViejos.Tables[0].Rows[0]["capacidadHabitacion"].ToString();
				costoHabitacion.Text = _tablaValoresViejos.Tables[0].Rows[0]["montoHabitacion"].ToString();

				for (int contador = 0; contador < listaTipoHabitaciones.Items.Count; contador++)
				{
					listaTipoHabitaciones.SelectedIndex = contador;
					if (listaTipoHabitaciones.SelectedValue == _tablaValoresViejos.Tables[0].Rows[0]["tipoHabitacion"].ToString())
					{
						AsignarCapacidadHabitacionSegunTipo();
						gridHabitaciones1.Visible = false;
						capacidadHabitacion.Enabled = false;

						return _datosCargados = true;
					}
				}
			}

			return _datosCargados;
		}

		private Boolean LlenarDropListsAfterModificarRequest(int _indexNumeroHabitacion, int _indexTipoHabitacion, int _indexPisoHabitacion)
		{
			if (_indexNumeroHabitacion != 0)
			{
				LlenarGridPorNumeroHabitacion(Session["idHotel"].ToString(), "0");
				contenedorAlterno.Visible = false;
				gridHabitaciones1.Visible = true;
				return true;
			}
			if (_indexTipoHabitacion != 0)
			{
				LlenarGridPorTipoHabitacion(Session["idHotel"].ToString(), CBlistaHabsTipo.SelectedItem.ToString());
				contenedorAlterno.Visible = false;
				gridHabitaciones1.Visible = true;
				return true;
			}
			if (_indexPisoHabitacion != 0)
			{
				LlenarGridPorPisoHabitacion(Session["idHotel"].ToString(), CBpisoHabitacion.SelectedValue.ToString());
				contenedorAlterno.Visible = false;
				gridHabitaciones1.Visible = true;
				return true;
			}

			return false;
		}

		private void AsignarCapacidadHabitacionSegunTipo()
		{
			string _tipoHabitacion = listaTipoHabitaciones.SelectedValue.ToString();
			switch (_tipoHabitacion)
			{
				case "Familiar":
					capacidadHabitacion.Text = "4";
					break;
				case "Queen Room":
					capacidadHabitacion.Text = "2";
					break;
				case "King Room":
					capacidadHabitacion.Text = "2";
					break;
				case "Kids Suite":
					capacidadHabitacion.Text = "4";
					break;
				case "DoubleRoom":
					capacidadHabitacion.Text = "4";
					break;
				case "Simple":
					capacidadHabitacion.Text = "1";
					break;
				default:
					capacidadHabitacion.Text = "2";
					break;

			}
		}

		private void EsconderDropListsYLabels()
		{
			//LnumeroHabitacion.Visible = false;
			//LTipoHabitacion.Visible = false;
			//LPisoHabitacion.Visible = false;
			//CBpisoHabitacion.Visible = false;
			//CBlistaHabitaciones.Visible = false;
			//CBlistaHabsTipo.Visible = false;
			gridHabitaciones1.Visible = false;
			contenedorAlterno.Visible = false;
		}

		private void MostrarDropListsYLabels()
		{
			LnumeroHabitacion.Visible = true;
			LTipoHabitacion.Visible = true;
			LPisoHabitacion.Visible = true;
			CBpisoHabitacion.Visible = true;
			CBlistaHabitaciones.Visible = true;
			CBlistaHabsTipo.Visible = true;
			gridHabitaciones1.Visible = true;
		}

		private void ResetElementosDropList()
		{
			CBlistaHabitaciones.SelectedIndex = 0;
			CBpisoHabitacion.SelectedIndex = 0;
			CBlistaHabsTipo.SelectedIndex = 0;
		}

		private void EliminarItemsDropList(DropDownList droplist)
		{
			int contadoritems = 0;

			while ((contadoritems = droplist.Items.Count) > 1)
			{
				droplist.Items.Remove(droplist.Items[contadoritems - 1]);
				contadoritems--;
			}

		}

		private void ResetearElementosContenedorAlterno()
		{
			numeroHabitacion.Text = "";
			TBpiso.Text = "";
			descripcionHabitacion.Text = "";
			listaTipoHabitaciones.SelectedIndex = 0;
			capacidadHabitacion.Text = "";
			costoHabitacion.Text = "";
			contenedorAlterno.Visible = false;
			gridHabitaciones1.Visible = true;
			idHotel.Value = "";
		}

		private Boolean ValidarPisoHabitacion(string _pisoHabitacion, string _idHotel)
		{
			LogicaPropiedades _filtro = new LogicaPropiedades();

			return _filtro.ValidarPisosHotel(_pisoHabitacion, _idHotel);
		}

		private Boolean ValidarEstandarNumeroHabitacion()
		{
			int _longitudMaxima = 3;
			int _diferenciaLongitud = numeroHabitacion.Text.Length - _longitudMaxima;
			if (numeroHabitacion.Text.Length == _longitudMaxima)
			{
				return true;
			}
			else
			{
				if (numeroHabitacion.Text.Length < _longitudMaxima)
				{
					while (_diferenciaLongitud >= 0)
					{
						numeroHabitacion.Text = "0" + numeroHabitacion.Text;
						_diferenciaLongitud--;
					}
					return true;
				}
				if (numeroHabitacion.Text.Length > _longitudMaxima)
				{
					return false;
				}
			}

			return false;
		}

		private Boolean ValidarPisoEstablecidoExista(string _piso, string _idHotel)
		{
			LogicaPropiedades _validar = new LogicaPropiedades();

			return _validar.ValidarPisosHotel(_piso, _idHotel);
		}

		private Boolean ValidarCostoEsFloat(string _costo)
		{
			float _resultado = 0;
			if (float.TryParse(_costo, out _resultado))
			{
				return true;
			}
			return false;
		}

		#endregion

		#region EVENTOS DE EDICION DE GRID VIEW
		protected void gridHabitaciones1_RowEditing(object sender, GridViewEditEventArgs e)
		{
			gridHabitaciones1.EditIndex = e.NewEditIndex;
			GridViewRow _filaGrid = gridHabitaciones1.Rows[e.NewEditIndex];
			int id = Int32.Parse(gridHabitaciones1.DataKeys[e.NewEditIndex].Value.ToString());
			if (CargarDatosEnElementos(id))
			{
				e.Cancel = true;
				gridHabitaciones1.EditIndex = -1;
				contenedorAlterno.Visible = true;
			}
			else
			{
				string _alerta = "alert('No se pueden modificar habitaciones que no esten disponibles');";
				ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "alert", _alerta, true);
			}
		}

		protected void gridHabitaciones1_PageIndexChanged(object sender, GridViewPageEventArgs e)
		{
			LogicaPropiedades _filtrado = new LogicaPropiedades();
			this.gridHabitaciones1.PageIndex = e.NewPageIndex;

			if (CBlistaHabitaciones.SelectedIndex != 0)
			{
				gridHabitaciones1.DataSource = _filtrado.filtrarPorNumeroHabitacion(CBlistaHabitaciones.SelectedValue, CBlistaHoteles.SelectedValue);
				gridHabitaciones1.DataBind();
			}
			if (CBlistaHabsTipo.SelectedIndex != 0)
			{
				gridHabitaciones1.DataSource = _filtrado.filtrarPorTipoHabitacion(CBlistaHabsTipo.SelectedValue, CBlistaHoteles.SelectedValue);
				gridHabitaciones1.DataBind();
			}
			if (CBpisoHabitacion.SelectedIndex != 0)
			{
				gridHabitaciones1.DataSource = _filtrado.filtrarPorPisoHabitacion(CBpisoHabitacion.SelectedValue, CBlistaHoteles.SelectedValue);
				gridHabitaciones1.DataBind();
			}
		}

		#endregion

		#region ACCIONES DE MODIFICACION
		protected void ButtonCancelar_Click(object sender, EventArgs e)
		{
			gridHabitaciones1.EditIndex = -1;
			ResetearElementosContenedorAlterno();
		}

		protected void botonModificar_Click(object sender, EventArgs e)
		{
			DataTable _datosModificar = new DataTable();
			_datosModificar = CreatTablaDatosModificados(_datosModificar);

			if (ValidarNumHabNoRepetido(numeroHabitacion.Text, idHabitacion.Value.ToString()))
			{
				if (ValidarEstandarNumeroHabitacion() && ValidarPisoEstablecidoExista(TBpiso.Text, idHotel.Value.ToString()) && ValidarCostoEsFloat(costoHabitacion.Text))
				{

					LogicaPropiedades _agregarFila = new LogicaPropiedades();
					if (_agregarFila.ModificarFilaHabitacion(_datosModificar, idHabitacion.Value.ToString()))
					{
						ResetearElementosContenedorAlterno();
						LlenarDropListsAfterModificarRequest(CBlistaHabitaciones.SelectedIndex, CBlistaHabsTipo.SelectedIndex, CBpisoHabitacion.SelectedIndex);
						ActualizarCBHidden(Convert.ToInt32(Session["idHotel"].ToString()));
						string _alerta = "alert('Habitacion modificada apropiadamente');";
						ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "alert", _alerta, true);
					}
				}
				else
				{
					string _alerta = "alert('Compruebe que los valores introducidos sean correctos')";
					ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "alert", _alerta, true);
				}
			}
			else
			{
				string _alerta = "alert('El numero de habitacion ya existe, cambie el numero.')";
				ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "alert", _alerta, true);
			}


			gridHabitaciones1.EditIndex = -1;
		}

		private void ActualizarCBHidden(int _hotel)
		{
			LogicaPropiedades _habitaciones = new LogicaPropiedades();
			CBnumHabsHidden.DataSource = _habitaciones.GetHabitaciones(_hotel);
			CBnumHabsHidden.DataBind();
			LlenarCBNumeroHabitaciones(_hotel);
		}

		private DataTable CreatTablaDatosModificados(DataTable _tabla)
		{
			_tabla.Columns.Add("numeroHabitacion", typeof(string));
			_tabla.Columns.Add("pisoHabitacion", typeof(string));
			_tabla.Columns.Add("capacidad", typeof(string));
			_tabla.Columns.Add("costo", typeof(string));
			_tabla.Columns.Add("descripcion", typeof(string));
			_tabla.Columns.Add("disponibilidad", typeof(bool));
			_tabla.Columns.Add("fkHotel", typeof(string));
			_tabla.Columns.Add("tipoHabitacion", typeof(string));

			_tabla.Rows.Add((numeroHabitacion.Text), (TBpiso.Text), (capacidadHabitacion.Text), (costoHabitacion.Text), descripcionHabitacion.Text, true, idHotel.Value.ToString(), listaTipoHabitaciones.SelectedValue.ToString());

			return _tabla;
		}
		#endregion


	}
}